package cn.chenyumeng.blog.service.admin.impl;

import cn.chenyumeng.blog.dto.TagDTO;
import cn.chenyumeng.blog.entity.Tag;
import cn.chenyumeng.blog.mapper.TagMapper;
import cn.chenyumeng.blog.service.admin.TagService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @program: blog->TagServiceImpl
 * @description:
 * @author: cg
 * @create: 2020-07-26 23:14
 **/
@Service
public class TagServiceImpl implements TagService {

    @Autowired
    private TagMapper tagMapper;

    @Override
    public List<TagDTO> queryAll() {
        List<Tag> tags = tagMapper.queryAll();
        if (tags.isEmpty()) {
            return null;
        }
        List<TagDTO> dtoList = new ArrayList<>();
        tags.forEach(tag -> {
            TagDTO dto = new TagDTO();
            BeanUtils.copyProperties(tag, dto);
            dtoList.add(dto);
        });
        return dtoList;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Transactional
    @Override
    public TagDTO queryById(Long id) {
        Tag tag = new Tag();
        tag.setId(id);
        List<Tag> tags = tagMapper.queryAllByTag(tag);
        TagDTO tagDTO = new TagDTO();
        BeanUtils.copyProperties(tags.get(0), tagDTO);
        return tagDTO;
    }

    /**
     * 查询多条数据
     *
     * @param page 页数
     * @param size 大小
     * @return 对象列表
     */
    @Transactional
    @Override
    public PageInfo<TagDTO> queryAllByLimit(int page, int size) {
        PageHelper.startPage(page, size);
        List<Tag> tags = tagMapper.queryAll();
        if (tags.isEmpty()) {
            return null;
        }
        PageInfo tagPageInfo = new PageInfo(tags);
        List<TagDTO> dots = new ArrayList<>();
        tagPageInfo.getList().forEach(tag -> {
            TagDTO target = new TagDTO();
            BeanUtils.copyProperties(tag, target);
            dots.add(target);
        });
        tagPageInfo.setList(dots);
        return tagPageInfo;
    }

    /**
     * 新增数据
     *
     * @param tagDTO 实例对象
     * @return 实例对象
     */
    @Transactional
    @Override
    public TagDTO insert(TagDTO tagDTO) {
        Tag tag = new Tag();
        // 去重
        if (getTagByName(tagDTO.getName()) != null) {
            return null;
        }
        tagDTO.setCreateTime(Date.from(Instant.now()));
        tagDTO.setUpdateTime(Date.from(Instant.now()));
        BeanUtils.copyProperties(tagDTO, tag);
        tagMapper.insert(tag);
        BeanUtils.copyProperties(tag, tagDTO);
        return tagDTO;
    }

    /**
     * 修改数据
     *
     * @param tagDTO 实例对象
     * @return 实例对象
     */
    @Transactional
    @Override
    public TagDTO update(TagDTO tagDTO) {
        Tag tag = new Tag();
        // 去重
        if (getTagByName(tagDTO.getName()) != null) {
            return null;
        }
        tagDTO.setUpdateTime(Date.from(Instant.now()));
        BeanUtils.copyProperties(tagDTO, tag);
        this.tagMapper.update(tag);
        return queryById(tag.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Transactional
    @Override
    public boolean deleteById(Long id) {
        return this.tagMapper.deleteById(id) > 0;
    }

    /**
     * 通过标签名称获取标签信息
     *
     * @param name 标签名称
     * @return
     */
    @Transactional
    @Override
    public TagDTO getTagByName(String name) {
        Tag tag = new Tag();
        tag.setName(name);
        List<Tag> types = tagMapper.queryAllByTag(tag);
        if (types.isEmpty()) {
            return null;
        }
        TagDTO tagDTO = new TagDTO();
        BeanUtils.copyProperties(types.get(0), tagDTO);
        return tagDTO;
    }

}
